import type { AxiosRequestConfig, AxiosInstance, AxiosResponse, AxiosError } from 'axios';
import type { RequestOptions, Result } from '/#/axios';

export interface CreateAxiosOptions extends AxiosRequestConfig {
  authenticationScheme?: string;
  transform?: AxiosTransform;
  requestOptions?: RequestOptions;
}

/**
 * AxiosTransform是一个抽象类，用于定义axios请求的转换逻辑。
 * 它包含了一系列的钩子函数，这些钩子函数可以在请求的不同阶段进行自定义处理。
 * 
 * @class AxiosTransform
 */
export abstract class AxiosTransform {
    /**
     * @description: 在请求发送之前对配置进行处理。
     * 可以在此处添加认证信息、修改请求头等操作。
     * 
     * @param {AxiosRequestConfig} config - 请求配置对象。
     * @param {RequestOptions} options - 额外的请求选项。
     * @returns {AxiosRequestConfig} - 处理后的请求配置对象。
     */
    beforeRequestHook?: (config: AxiosRequestConfig, options: RequestOptions) => AxiosRequestConfig;

    /**
     * @description: 成功请求后的数据转换处理。
     * 可以在此处对响应数据进行格式化或提取特定字段。
     * 
     * @param {AxiosResponse<Result>} res - 响应对象。
     * @param {RequestOptions} options - 额外的请求选项。
     * @returns {any} - 转换后的响应数据。
     */
    transformRequestHook?: (res: AxiosResponse<Result>, options: RequestOptions) => any;
  
    /**
     * @description: 请求失败时的错误处理。
     * 可以在此处记录错误日志或返回默认值。
     * 
     * @param {Error} e - 错误对象。
     * @param {RequestOptions} options - 额外的请求选项。
     * @returns {Promise<any>} - 处理后的结果。
     */
    requestCatchHook?: (e: Error, options: RequestOptions) => Promise<any>;
  
    /**
     * @description: 请求之前的拦截器。
     * 可以在此处对请求进行全局修改。
     * 
     * @param {AxiosRequestConfig} config - 请求配置对象。
     * @param {CreateAxiosOptions} options - 创建axios实例时的选项。
     * @returns {AxiosRequestConfig} - 修改后的请求配置对象。
     */
    requestInterceptors?: (config: AxiosRequestConfig, options: CreateAxiosOptions) => AxiosRequestConfig;
  
    /**
     * @description: 请求之后的拦截器。
     * 可以在此处对响应进行全局修改。
     * 
     * @param {AxiosResponse<any>} res - 响应对象。
     * @returns {AxiosResponse<any>} - 修改后的响应对象。
     */
    responseInterceptors?: (res: AxiosResponse<any>) => AxiosResponse<any>;
  
    /**
     * @description: 请求之前的拦截器错误处理。
     * 可以在此处处理拦截器中的异常。
     * 
     * @param {Error} error - 错误对象。
     */
    requestInterceptorsCatch?: (error: Error) => void;
  
    /**
     * @description: 请求之后的拦截器错误处理。
     * 可以在此处处理响应拦截器中的异常。
     * 
     * @param {Error} error - 错误对象。
     */
    responseInterceptorsCatch?: (error: Error) => void;
}